package _case

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
	"strings"
)

const README = "./12-file-rw/README.md"

//一次性读取文件
//按行拆分打印
//适合小文件读取

func Readline1() {
	//仅读方式打开文件
	f, err := os.OpenFile(README, os.O_RDONLY, 0666)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	//
	bytes, err := io.ReadAll(f)
	if err != nil {
		log.Fatal(err)
	}
	//按分行切割
	list := strings.Split(string(bytes), "\n")
	for _, i := range list {
		fmt.Println(i)
	}
}

// 通过bufio 按行读取
// bufio 通过io模块的封装，提高了数据的缓冲功能，能一定程度上减少大数据块读写带来的开销
// 当发起读写操作时，会尝试从缓冲读取数据，缓冲区没有数据，才会从数据源读取
// 缓冲区默认大小4k
func Readline2() {
	//仅读方式打开文件
	f, err := os.OpenFile(README, os.O_RDONLY, 0666)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	reader := bufio.NewReader(f)
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF {
			break
		}
		fmt.Print(str)
	}
}

// 通过scanner 按行读取
// 单行默认大小64k
func Readline3() {
	//仅读方式打开文件
	f, err := os.OpenFile(README, os.O_RDONLY, 0666)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}
